Thread Pool Manager?
Otázka od: Milan Cizek
31. 8. 2002 18:20
Ahoj,
nejsem si jisty, jestli jsem v subjektu spravne vystihl svuj problem -
tusim, ze se tomu tak nejak rika. Jde mi o nasledujici: mam objekt
(odvozena od TThread), ktera se dotazuje do internetu a zpracovava vracene
udaje. Abych zbytecne neprodelaval na timeoutech, chtel bych v programu
urcit pocet vlaken, ktera budou pracovat soubezne. Jeste dodam, ze .execute
te funkce konci az pri zavolani Terminate.
Muj pokus je zatim nasledujici: vytvoril jsem si dalsi objekt
(TThreadManager), kteremu nastavim vsechny potrebne udaje. Zdrojova data
nacitam z DB, coz jsem osetril kritickou sekci. Nevim, jak v tomto pripade
pristoupit z TChecker k parametrum TThreadManager (FProxyServer), nerad bzch
to resil globalni promenou nebo opetovnym predavanim v konstruktoru. Neco
takoveho delam poprve... Pokud program ukoncim beznym zpusobem, vola se
destruktor TThreadManageru? Nebo musim volat destroy v OnClose formulare? Ci
snad zcela jine reseni? Diky.
TChecker = class(TThread)
protected
{ Protected declarations }
procedure Display;
procedure Execute; override;
public
{ Public declarations }
FURL: string;
FProxyServer: TProxyParams;
FStatusCode: integer;
procedure Error;
procedure CheckURL;
constructor Create;
end;
TThreadManager = class(TObject)
protected
{ Protected declarations }
FThreads: array of TChecker;
FSection: TRTLCriticalSection;
public
{ Public declarations }
FProxyServer: TProxyParams;
constructor Create(Threads: integer);
destructor Destroy; override;
end;
constructor TThreadManager.Create(Threads: integer);
var Count: integer;
begin
InitializeCriticalSection(FSection);
SetLength(FThreads,Threads);
for Count:=0 to Threads-1 do FThreads[Count]:=TChecker.Create;
end;
destructor TThreadManager.Destroy;
var Count: integer;
begin
for Count:=Low(FThreads) to High(FThreads) do FThreads[Count].Terminate;
DeleteCriticalSection(FSection);
end;
...
begin
TThreadManager.Create(8);
end;
S pozdravem Milan Cizek, amatersky programator, D6.02 Ent
Win2k (SP2) a WinXP, cizek.milan@seznam.cz, ICQ: 59826637